//package com.inspur.edp.cef.rtgenerator.repositorygen.adaptor;
//
////import Inspur.Ecp.Caf.ServiceMgr.*;
////import Inspur.Gsp.Caf.Generator.BaseInfoItem.*;
////import Inspur.Gsp.Caf.Generator.ClassGenerator.*;
////import Inspur.Gsp.Caf.Generator.ClassMethodGenerator.*;
////import Inspur.Gsp.Caf.Generator.FieldGenerator.*;
////import Inspur.Gsp.Caf.Generator.PropertyGenerator.*;
////import Inspur.Gsp.Cef.Api.Attribute.*;
////import Inspur.Gsp.Cef.Api.Manager.*;
////import Inspur.Gsp.Cef.Entity.Condition.*;
////import Inspur.Gsp.Cef.Repository.*;
////import Inspur.Gsp.Cef.Repository.Adaptor.*;
////import Inspur.Gsp.Cef.Repository.Utils.*;
////import Inspur.Gsp.Cef.RTGenerator.Common.*;
////import Inspur.Gsp.Lcm.DatabaseObject.Api.Entity.*;
////import Inspur.Gsp.Lcm.DatabaseObject.Api.Service.*;
////import Inspur.Ecp.Caf.Common.*;
////import Inspur.Gsp.Cef.RTGenerator.RepositoryGen.*;
////import Inspur.Gsp.Cef.RTGenerator.RepositoryGen.Adaptor.Method.EntityRelationalAdapter.*;
//
//import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
//import com.inspur.edp.caf.generator.field.FieldGenerator;
//import com.inspur.edp.caf.generator.item.ClassGeneratorContext;
//import com.inspur.edp.caf.generator.method.ClassMethodGenerator;
//import com.inspur.edp.caf.generator.property.ClassPropertyGenerator;
//import com.inspur.edp.cef.api.RefObject;
//import com.inspur.edp.cef.api.attr.NestedConfigAtrribute;
//import com.inspur.edp.cef.api.manager.IRepositoryFactory;
//import com.inspur.edp.cef.api.repository.GspDbDataType;
//import com.inspur.edp.cef.api.repository.IRootRepository;
//import com.inspur.edp.cef.entity.condition.FilterCondition;
//import com.inspur.edp.cef.entity.condition.SortCondition;
//import com.inspur.edp.cef.entity.dependenceTemp.DataValidator;
//import com.inspur.edp.cef.gencommon.ReflectionUtils;
//import com.inspur.edp.cef.repository.adaptor.EntityRelationalAdaptor;
//import com.inspur.edp.cef.repository.assembler.AssociationInfo;
//import com.inspur.edp.cef.repository.assembler.DataTypeAssembler;
//import com.inspur.edp.cef.repository.assembler.entity.ColumnInfo;
//import com.inspur.edp.cef.repository.assembler.entity.DbTableInfo;
//import com.inspur.edp.cef.repository.assembler.entity.ExtendEntityAssembler;
//import com.inspur.edp.cef.repository.assembler.entity.MainEntityAssembler;
//import com.inspur.edp.cef.repository.dbcolumninfo.DbColumnInfo;
//import com.inspur.edp.cef.repository.dbcolumninfo.DbColumnInfoCollection;
//import com.inspur.edp.cef.repository.sqlgenerator.BaseSqlGenerator;
//import com.inspur.edp.cef.repository.utils.TenantUtil;
//import com.inspur.edp.cef.rtgenerator.accessorgen.property.NodeCodeGenerator;
//import com.inspur.edp.cef.rtgenerator.common.CefDataInterfaceInfo;
//import com.inspur.edp.cef.rtgenerator.repositorygen.AssemblerInfo;
//import com.inspur.edp.cef.rtgenerator.repositorygen.RepositoryGenUtil;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.*;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.createinstance.EntityCreateInsGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.entityrelationaladapter.GetPropertyColumnMappingMethodGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.entityrelationaladapter.HasPropColumnMapppingMethodGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.entityrelationaladapter.PropIndexMappingDictVarGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.entityrelationaladapter.SetPropertyColumnMappingMethodGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.getvaluegen.GetValueGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.method.readproperty.DataTypeReadPropertyGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.adaptor.property.*;
//import com.inspur.edp.cef.rtgenerator.repositorygen.dac.DataTypeDacGenContext;
//import com.inspur.edp.cef.rtgenerator.repositorygen.dac.method.ChildEntityConstructorGenerator;
//import com.inspur.edp.cef.rtgenerator.repositorygen.dac.property.ParentJoinPropGneratpr;
//import com.inspur.edp.cef.rtgenerator.utils.GeneratorUtil;
//import com.inspur.edp.lcm.databaseobject.api.DatabaseObjectServiceForWebIde;
//import io.iec.edp.caf.databaseobject.api.entity.DatabaseObjectColumn;
//import io.iec.edp.caf.databaseobject.api.entity.DatabaseObjectTable;
////import io.iec.edp.caf.databaseobject.api.service.IDatabaseObjectRtService;
////import io.iec.edp.caf.databaseobject.api.service.IDatabaseObjectService;
//import io.iec.edp.caf.databaseobject.api.entity.DatabaseObjectTableCore;
//import org.eclipse.jdt.core.dom.Modifier;
//
//import java.lang.reflect.InvocationTargetException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//

////using TypeInfo = Inspur.Gsp.Caf.Generator.BaseInfoItem.TypeInfo;
//
//public abstract class EntityRelationAdaptorGenerator extends EntityAdaptorGenerator {
//
//	///#region 字段与属性
//	private MainEntityAssembler mainAssembler;
//	private DatabaseObjectTableCore dbo;
//	private String primaryColumnName;
//	private String parentIdColumnName;
//	private String queryTableName;
//	private String queryColumns;
//	private String insertColumns;
//	private String insertParams;
//	private java.util.ArrayList<FilterCondition> filterConditions;
//	private java.util.ArrayList<SortCondition> sortConditions;
//	private java.util.HashMap<String, String> mappingPropNames = new java.util.HashMap<String, String>();
//
//
//	public String getGeneratedName() {
//		return getName();
//	}
//
//	protected abstract BaseSqlGenerator getSqlGenerator();
//
//	// endregion
//	public EntityRelationAdaptorGenerator(DataTypeDacGenContext dacContext, String nodeCode, boolean isChild, AssemblerInfo baseAssembler, java.util.ArrayList<AssemblerInfo> extendAssemblers) {
//		super(dacContext, nodeCode, isChild, baseAssembler, extendAssemblers);
//		DataTypeAssembler tempVar = BaseAssembler.getAssemblerInstance();
//		mainAssembler = (MainEntityAssembler) ((tempVar instanceof MainEntityAssembler) ? tempVar : null);
//		init();
//	}
//
//	// region init
//	private void init() {
//		initTableInfo();
//		initColumns();
//		initAssociationInfo();
//		//getQueryTableName();
//		//BuildQueryColumns();
//		initConditions();
//	}
////
////	@Autowired
////	private IDatabaseObjectRtService dboservice;
//
//	// region initTable
//	private void initTableInfo() {
//		String dboId = mainAssembler.getTableInfo().getDboId();
//
////		String path = DacContext.getReposContext().getCefContext().getCompileContext().getProjPath();
//		String path =DacContext.getReposContext().getCefContext().getCompileContext().getProjPath();
//		//IDatabaseObjectService dboservice = RepositoryGenUtil.getBeanByType(IDatabaseObjectService.class);
//		DatabaseObjectServiceForWebIde  dboservice = RepositoryGenUtil.getBeanByType(DatabaseObjectServiceForWebIde.class);
//		Object tempVar = dboservice.getDatabaseObjectById(path, dboId);
//		dbo = (DatabaseObjectTableCore) ((tempVar instanceof DatabaseObjectTableCore) ? tempVar : null);
//		if (dbo == null) {
//			throw new RuntimeException("be[" + GeneratorUtil.getName(DacContext.getReposContext().getCefContext().getCefConfig().getID()) + "]编译时找不到节点[" + NodeCode + "]对应的DBO，ID是" + dboId + "的DBO");
//		}
//		//DataValidator.checkForNullReference(dbo, "dbo");
//		mainAssembler.getTableInfo().setTableName(dbo.getCode());
//		//不需要了
//		//mainAssembler.getTableInfo().setIsFiscal(dbo.isFiscalTable());
//	}
//	//endregion
//
//	//region initColumn
//	private void initColumns() {
//		DbColumns = new DbColumnInfoCollection();
//		for (ColumnInfo columnInfo : mainAssembler.getContainColumns()) {
//			DbColumnInfo dbColumnInfo = transDbColumnInfo(columnInfo);
//			if (dbColumnInfo.getIsPrimaryKey()) {
//				primaryColumnName = dbColumnInfo.getDbColumnName();
//			}
//			if (dbColumnInfo.getIsParentId()) {
//				parentIdColumnName = dbColumnInfo.getDbColumnName();
//			}
//			DbColumns.add(dbColumnInfo);
//		}
//		//ContainColumns.AddRange(AssemblerItem.ContainColumns);
//		if (ExtendAssemblers == null || ExtendAssemblers.size() < 1) {
//			return;
//		}
//		for (AssemblerInfo extendAssmeblerItem : ExtendAssemblers) {
//			//ContainColumns.AddRange(extendAssmeblerItem.AssemblerInstance);
//			initExtendColumns(extendAssmeblerItem.getAssemblerInstance());
//		}
//	}
//
//	private void initExtendColumns(DataTypeAssembler assemblerInstance) {
//		ExtendEntityAssembler extendAssembly = (ExtendEntityAssembler) ((assemblerInstance instanceof ExtendEntityAssembler) ? assemblerInstance : null);
//		for (ColumnInfo columnInfo : extendAssembly.getContainColumns()) {
//			DbColumnInfo dbColumnInfo = transDbColumnInfo(columnInfo);
//			DbColumns.add(dbColumnInfo);
//		}
//	}
//
//	private DbColumnInfo transDbColumnInfo(ColumnInfo columnInfo) {
//		DataValidator.checkForNullReference(columnInfo, "columnInfo");
//		DatabaseObjectColumn dboColumn = dbo.getColumnById(columnInfo.getDboColumnId());
//		if (dboColumn == null) {
//			throw new RuntimeException("dbo[" + dbo.getCode() + "]上不存在ID为{columnInfo.DboColumnId}, 名称为{columnInfo.ColumnName}的列");
//		}
//		DbColumnInfo tempVar = new DbColumnInfo();
//		tempVar.setColumnName(columnInfo.getColumnName());
//		tempVar.setDbColumnName(dboColumn.getCode());
//		tempVar.setLength(dboColumn.getLength());
//		tempVar.setPrecision(dboColumn.getPrecision());
//		tempVar.setDefaultValue(dboColumn.getDefaultValue());
//		tempVar.setColumnType(GeneratorUtil.transDataType(dboColumn.getDataType()));
//		tempVar.setIsAssociateRefElement(columnInfo.getIsAssociateRefElement());
//		tempVar.setIsMultiLang(columnInfo.getIsMultiLang());
//		tempVar.setIsParentId(columnInfo.getIsParentId());
//		tempVar.setIsPrimaryKey(columnInfo.getIsPrimaryKey());
//		tempVar.setIsUdtElement(columnInfo.getIsUdtElement());
//		tempVar.setIsAssociation(columnInfo.getIsAssociation());
//		tempVar.setIsEnum(columnInfo.getIsEnum());
//		tempVar.setBelongElementLabel(columnInfo.getBelongElementLabel());
//		tempVar.setTypeTransProcesser(columnInfo.getTypeTransProcesser());
//		DbColumnInfo column = tempVar;
//		return column;
//	}
//	//endregion
//
//	//region initAssociation
//	private void initAssociationInfo() {
//		java.util.ArrayList<AssociationInfo> associtateList = mainAssembler.getAssociationInfos();
//		if (associtateList != null && associtateList.size() > 0) {
//			associationInfos.addAll(associtateList);
//		}
//		if (ExtendAssemblers == null || ExtendAssemblers.size() < 1) {
//			return;
//		}
//
//		for (AssemblerInfo extendAssmeblerItem : ExtendAssemblers) {
//
//			ArrayList<AssociationInfo> extendAssocitateList = ((ExtendEntityAssembler) ((extendAssmeblerItem.getAssemblerInstance() instanceof ExtendEntityAssembler) ? extendAssmeblerItem.getAssemblerInstance() : null)).getAssociationInfos();
//			if (extendAssocitateList != null && extendAssocitateList.size() > 0) {
//				associationInfos.addAll(extendAssocitateList);
//			}
//		}
//	}
//
//	public final String getQueryTableName() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
//		//跟之前一致，并且在当前实例上做缓存。
//		queryTableName = getTableNamesWithAssociationInfo(associationInfos, null);
//		return queryTableName;
//	}
//
//	private String getTableNamesWithAssociationInfo(java.util.ArrayList<AssociationInfo> associations, java.util.ArrayList<String> tableAlias) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
//		if (tableAlias == null) {
//			tableAlias = new java.util.ArrayList<String>();
//			mainAssembler.initTableAlias(tableAlias);
//		} else {
//			mainAssembler.getTableInfo().setAlias(getTableAlias4Association(tableAlias));
//		}
//
//		if (associations.size() < 1) {
//			tableAlias.add(getAlias());
//			return getTableName();
//		}
//		StringBuilder queryTableNames = new StringBuilder().append(getTableName());
//
//		for (AssociationInfo associationInfo : associations) {
//			java.util.HashMap<String, String> associationColumns = new java.util.HashMap<String, String>();
//			for (Map.Entry<String, String> item : associationInfo.getRefColumns().entrySet()) {
//				associationColumns.put(item.getValue(), "");
//			}
//			String targetDbColumnName = "";
//			//TODO 年度
//			//associationInfo.RefRepository.initContext(context.ReposContext.EnvVars);
//			java.lang.Class reposFactoryType = DacContext.getReposContext().getCefContext().entityRepositoryFactory();
//			Object tempVar = ReflectionUtils.createInstance(reposFactoryType);
////			reposFactoryType.Assembly.CreateInstance(reposFactoryType.FullName);
//			IRepositoryFactory repositoryFactory = (IRepositoryFactory) ((tempVar instanceof IRepositoryFactory) ? tempVar : null);
//			IRootRepository refRepository = repositoryFactory.createRepository(associationInfo.getConfigId());
//			RefObject<String> tempRef_targetDbColumnName = new RefObject<String>(targetDbColumnName);
//			String tableName = refRepository.getTableNameByColumns(associationInfo.getNodeCode(), associationColumns, associationInfo.getTargetColumn(), tempRef_targetDbColumnName, tableAlias);
//			targetDbColumnName = tempRef_targetDbColumnName.argvalue;
//
//			initAssociateColumnInfo(associationInfo, associationColumns);
//
//			String joinTableName = getSqlGenerator().getJoinTableName();
//
//			String sourceColumnName = trans2DbColumn(associationInfo.getSourceColumn());
//			queryTableNames.append(String.format(joinTableName, tableName, sourceColumnName, targetDbColumnName));
//		}
//
//		return queryTableNames.toString();
//	}
//
//	private String getTableAlias4Association(java.util.ArrayList<String> tableAlias) {
//		String alias = getAlias();
//		if (!tableAlias.contains(alias)) {
//			tableAlias.add(alias);
//			return alias;
//		}
//
//		int index = 1;
//		while (true) {
//			if (tableAlias.contains(alias + index)) {
//				index++;
//			} else {
//				tableAlias.add(alias + index);
//				return alias + index;
//			}
//		}
//	}
//
//	public final String getAlias() {
//		return mainAssembler.getTableInfo().getAlias();
//	}
//
//	public final String trans2DbColumn(String filedName) {
//		//跟原来一致
//		if (!DbColumns.contains(filedName)) {
//			throw new RuntimeException("未找到字段" + filedName + "，请确认字段名称是否输入正确，或关联引用字段是否已经获取");
//		}
//		//return assColumns.ContainsKey(filedName) ? assColumns[filedName] : throw new Exception("Error");
//		if (DbColumns.getItem(filedName).getIsAssociateRefElement()) {
//			return getAssociateDbColumnName(DbColumns.getItem(filedName));
//		}
//		//return assColumns.ContainsKey(filedName) ? assColumns[filedName] : throw new Exception("Error");
//
//		String dbName = getAlias() + "." + DbColumns.getItem(filedName).getDbColumnName();
//		if (DbColumns.getItem(filedName).getIsMultiLang()) {
//			dbName = getMultiLangColumnName(dbName);
//		}
//		return dbName;
//	}
//
//	private String getAssociateDbColumnName(DbColumnInfo columnInfo) {
//		if (columnInfo.getDbColumnName().equals( "") || columnInfo.getDbColumnName() == null) {
//			throw new RuntimeException("尚未获取关联引用字段数据库列名称，请先获取引用字段");
//		}
//		return columnInfo.getDbColumnName();
//	}
//
//	/**
//	 * 获取多语列
//	 *
//	 * @param columnName 列名（DBName）
//	 * @return
//	 */
//	protected String getMultiLangColumnName(String columnName) {
//		//string currentLanguage = I18NUtils.getCurrentLanguage();
//		//return columnName + I18NUtils.getFieldSuffix(currentLanguage);
//		return columnName + "@Language@";
//	}
//
//	private void initAssociateColumnInfo(AssociationInfo associationInfo, java.util.HashMap<String, String> associationColumns) {
//		for (Map.Entry<String, String> refColumnItem : associationInfo.getRefColumns().entrySet()) {
//			if (DbColumns.contains(refColumnItem.getKey())) {
//				DbColumns.getItem(refColumnItem.getKey()).setDbColumnName(associationColumns.get(refColumnItem.getValue()));
//			} else {
//				DbColumnInfo tempVar = new DbColumnInfo();
//				tempVar.setColumnName(refColumnItem.getKey());
//				tempVar.setDbColumnName(associationColumns.get(refColumnItem.getValue()));
//				tempVar.setIsAssociateRefElement(true);
//				tempVar.setBelongElementLabel(associationInfo.getSourceColumn());
//				DbColumnInfo columnInfo = tempVar;
//				DbColumns.add(columnInfo);
//			}
//		}
//	}
//
//	/**
//	 * 获取表名（带别名）
//	 *
//	 * @return
//	 */
//	public final String getTableName() {
//		//var year = Convert.ToString(context.ReposContext.EnvVars["Fiscal"]);
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//		return getTableNameWithYear(tableInfo) + " " + tableInfo.getAlias();
//	}
//
//	public final String getTableNameWithYear(DbTableInfo tableInfo) {
//		if (tableInfo.getIsFiscal()) {
//			return tableInfo.getTableName() + "@YY@";
//		}
//		return tableInfo.getTableName();
//	}
//
//	public final String getTableNameByColumns(java.util.HashMap<String, String> columns, String keyColumnName, RefObject<String> keyDbColumnName, java.util.ArrayList<String> tableAlias) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
//		//跟之前一致。
//		java.util.ArrayList<AssociationInfo> associations = getAssociationInfos(columns);
//		String tableName = getTableNamesWithAssociationInfo(associations, tableAlias);
//
//		keyDbColumnName.argvalue = trans2DbColumn(keyColumnName);
//
//		List<String> keys = new ArrayList<>();
//		for (String key : columns.keySet()) {
//			keys.add(key);
//		}
//
//		for (int i = 0; i < keys.size(); i++) {
//			columns.put(keys.get(i), trans2DbColumn(keys.get(i)));
//		}
//		return tableName;
//	}
//
//	private java.util.ArrayList<AssociationInfo> getAssociationInfos(java.util.HashMap<String, String> columns) {
//		java.util.ArrayList<AssociationInfo> associations = new java.util.ArrayList<AssociationInfo>();
//		for (Map.Entry<String, String> columnItem : columns.entrySet()) {
//			if (!DbColumns.contains(columnItem.getKey()) || DbColumns.getItem(columnItem.getKey()).getIsAssociateRefElement()) {
//				associations.add(findInAssociationInfos(columnItem.getKey()));
//			}
//		}
//		return associations;
//	}
//
//	private AssociationInfo findInAssociationInfos(String columnName) {
//		for (AssociationInfo associationInfo : associationInfos) {
//			if (associationInfo.getRefColumns().containsKey(columnName)) {
//				return associationInfo;
//			}
//		}
//
//		throw new RuntimeException("找不到字段" + columnName);
//	}
//	//endregion
//
//	public final void buildQueryColumns() {
//		//跟之前一致，并且在当前实例上做缓存。
//		StringBuilder columns = new StringBuilder();
//		for (DbColumnInfo containColumn : DbColumns) {
//			if (columns.toString() != "" && columns.toString() != null) {
//				columns.append(",");
//			}
//			columns.append(trans2DbColumn(containColumn.getColumnName())).append(" AS ").append(containColumn.getColumnName());
//		}
//
//		queryColumns = columns.toString();
//	}
//	//endregion
//
//	//region Impl
//	@Override
//	protected ClassGeneratorContext createClassInfoContext() {
//		return new ClassGeneratorContext();
//	}
//
//	protected String getNameSpace() {
//		return DacContext.getReposContext().getCefContext().getDefaultNamespace();
//	}
//
//	@Override
//	protected TypeInfo setParentClass() {
//		return new TypeInfo(EntityRelationalAdaptor.class);
//	}
//
//	@Override
//	protected ArrayList<Modifier.ModifierKeyword> getAccessModifier() {
//		ArrayList<Modifier.ModifierKeyword> list = new ArrayList<Modifier.ModifierKeyword>();
//		list.add(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
//		return list;
//	}
//
//	@Override
//	protected java.util.ArrayList<ClassPropertyGenerator> createPropertyGenerators() {
//		java.util.ArrayList<ClassPropertyGenerator> propGenerators = super.createPropertyGenerators();
//		if (propGenerators == null)
//			propGenerators = new java.util.ArrayList<ClassPropertyGenerator>();
//
//		//protected abstract string TableName { get; }
//		//var tableNameGenerator = new TableNamePropGenerator(mainAssembler);
//		//propGenerators.Add(tableNameGenerator);
//		TableAliasPropGenerator tableAliasGenerator = new TableAliasPropGenerator();
//		propGenerators.add(tableAliasGenerator);
//		//protected abstract string QueryFields { get; }
//		//var queryFieldsGenerator = new QueryFieldsPropGenerator(queryColumns);
//		//propGenerators.Add(queryFieldsGenerator);
//		////protected abstract string QueryTables { get; }
//		//var queryTablesGenerator = new QueryTablePropGenerator(queryTableName);
//		//propGenerators.Add(queryTablesGenerator);
//		//protected abstract string PrimaryKey { get; }
//		PrimaryPropGenerator primaryGenerator = new PrimaryPropGenerator(primaryColumnName);
//		propGenerators.add(primaryGenerator);
//		////protected abstract string DefaultSort { get; }
//		//var sortConditionStr = BuildOrderByCondition();
//		//var sortGenerator = new DefaultSortGenerator(sortConditionStr);
//		//propGenerators.Add(sortGenerator);
//
//		//protected abstract string ConfigId { get; }
//		ConfigIdPropGenerator configIdGenerator = new ConfigIdPropGenerator(DacContext.getReposContext().getCefContext().getCefConfig().getID());
//		propGenerators.add(configIdGenerator);
//
//
//		//public abstract string ParentJoin { get; }
//		String parentIdDbColumn = null;
//		if (IsChildAdaptor)
//		//Bug 284235, parentIdColumnName已经是dbColumnName了而且不可能是多语字段, 所以不需要走trans2DbColumn
//		{
//			parentIdDbColumn = getAlias() + "." + parentIdColumnName; //trans2DbColumn(parentIdColumnName);
//		}
//		ParentJoinPropGneratpr joinTableGen = new ParentJoinPropGneratpr(getSqlGenerator(), parentIdDbColumn, BaseAssembler, IsChildAdaptor,DacContext);
//		propGenerators.add(joinTableGen);
//
//		propGenerators.add(new DboIDPropertyGenerator(dbo.getId()));
//
//		//protected abstract bool EnableFiscal { get; }
//		//var fiscalGen = new EnableFiscalGenerator(dbo.IsFiscalTable);
//		//propGenerators.Add(fiscalGen);
//
//		//protected abstract string DeleteSqlBatch { get; }
//		DeleteSqlBatchGenerator deleteBatchGen = new DeleteSqlBatchGenerator(getDeleteSql());
//		propGenerators.add(deleteBatchGen);
//
//		//protected abstract string GetDataByIdsSql { get; }
//		String retrieveBatchSql = getRetrieveBatchSql();
//		RetrieveBatchGenerator retrieveBatchGen = new RetrieveBatchGenerator(retrieveBatchSql);
//		propGenerators.add(retrieveBatchGen);
//
//		//protected abstract string GetDataByIdSql { get; }
//		String retrieveSql = getRetrieveSql();
//		RetrieveGenerator retrieveGen = new RetrieveGenerator(retrieveSql);
//		propGenerators.add(retrieveGen);
//
//		//protected abstract string JoinTableName { get; }
//		String joinTableName = getJoinTableName();
//		JoinTableNameGenerator joinTableNameGen = new JoinTableNameGenerator(joinTableName);
//		propGenerators.add(joinTableNameGen);
//
//		ArrayList<Modifier.ModifierKeyword> modifierKeywords = new ArrayList<>();
//		modifierKeywords.add(Modifier.ModifierKeyword.PROTECTED_KEYWORD);
//		NodeCodeGenerator nodeCodeGen = new NodeCodeGenerator(mainAssembler.getNodeCode(), modifierKeywords, true);
//		propGenerators.add(nodeCodeGen);
//
//		VersionControlPropGenerator vcsPropGen =
//				new VersionControlPropGenerator(DacContext.getReposContext().getCefContext().getVersionControlPropName());
//		propGenerators.add(vcsPropGen);
//		return propGenerators;
//	}
//
//	private String buildOrderByCondition() {
//		StringBuilder orderByBuilder = new StringBuilder();
//		if (sortConditions != null && sortConditions.size() > 0) {
//			for (SortCondition orderByItem : sortConditions) {
//				if (orderByBuilder.toString() != null && orderByBuilder.toString() != "") {
//					orderByBuilder.append(", ");
//				}
//				String filedName = trans2DbColumn(orderByItem.getSortField());
//				orderByBuilder.append(orderByItem.trans2Sql(filedName));
//			}
//		}
//
//		return String.valueOf(orderByBuilder);
//	}
//
//	//region BuildInsertSql
//	private String getInsertSql() {
//		String sql = getSqlGenerator().getInsertSql();
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//
//		buildInsertColumnsAndParams();
//		return String.format(sql, "@TableName@", insertColumns, insertParams); //getTableNameWithYear(tableInfo)
//	}
//
//	private String getInsertColumns()
//	{
//		buildInsertColumnsAndParams();
//		return insertColumns;
//	}
//
//	private void buildInsertColumnsAndParams() {
//		//跟之前一致，并且在当前实例上做缓存。
//		StringBuilder columnNames = new StringBuilder();
//		StringBuilder valueParamter = new StringBuilder();
//		int paramterNum = 0;
//		for (DbColumnInfo columnInfo : DbColumns) {
//			if (columnInfo.getIsAssociateRefElement()) {
//				continue;
//			}
//			if (columnNames.toString() != null &&  "".equals(columnNames.toString()) == false) {
//				columnNames.append(", ");
//				valueParamter.append(", ");
//			}
//			if (columnInfo.getIsMultiLang()) {
//				columnNames.append(getMultiLangColumnName(columnInfo.getDbColumnName()));
//			} else {
//				columnNames.append(columnInfo.getDbColumnName());
//			}
//			valueParamter.append("?" + (paramterNum++));
//		}
//
//		if (TenantUtil.IsDiscriminator()) {
//			String tenantColName = TenantUtil.GetTenantColumnName();
//			columnNames.append(", ").append(tenantColName);
//			valueParamter.append(", ").append("?" + (paramterNum++));
//		}
//
//		insertColumns = columnNames.toString();
//		insertParams = valueParamter.toString();
//	}
//	//endregion
//
//	//region BuildDeleteSql
//
//	private String getDeleteSql() {
//		String deleteSql = getSqlGenerator().getDeleteSql();
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//		return String.format(deleteSql, "@TableName@", tableInfo.getAlias()); //getTableNameWithYear(tableInfo)
//	}
//
//	private String getModifySql() {
//		//TODO 后续改到SqlGenerator，或者提到基类
//		String modifySql = "Update %1$s Set";
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//		return String.format(modifySql, "@TableName@"); //getTableNameWithYear(tableInfo)
//	}
//
//	private String getRetrieveSql() {
//		String retrieveSql = getSqlGenerator().getRetrieveSql();
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//		return String.format(retrieveSql, "%1$s", "%2$s", tableInfo.getAlias() + "." + primaryColumnName, "%3$s");
//	}
//
//	private String getRetrieveBatchSql() {
//		String retrieveSql = getSqlGenerator().getRetrieveBatchSql();
//		DbTableInfo tableInfo = mainAssembler.getTableInfo();
//		return String.format(retrieveSql, "%1$s", "%2$s", tableInfo.getAlias() + "." + primaryColumnName, "%3$s");
//	}
//
//	//endregion
//
//	private String getJoinTableName() {
//		return getSqlGenerator().getJoinTableName();
//	}
//
//	//endregion
//
//
//	//region field
//	@Override
//	protected java.util.ArrayList<FieldGenerator> createFieldGenerator() {
//		java.util.ArrayList<FieldGenerator> filedGenerators = super.createFieldGenerator();
//		if (filedGenerators == null) {
//			filedGenerators = new java.util.ArrayList<FieldGenerator>();
//		}
//		buildMappingGenerator(filedGenerators);
//		TableAliasFieldGenerator aliasFieldGen = new TableAliasFieldGenerator(mainAssembler);
//		filedGenerators.add(new PropIndexMappingDictVarGenerator());
//		filedGenerators.add(aliasFieldGen);
//
//		return filedGenerators;
//	}
//
//	//private void initMappingAttributes()
//	//{
//	//    var properties = BuildPropertyInfos();
//	//    foreach (var propertyInfo in properties)
//	//    {
//	//        var dataTypeAttrType = DacContext.ReposContext.CefContext.DataTypeAttrType;//getDataTypeAttrType();
//	//        var dataTypeAttribute = propertyInfo.getCustomAttribute(dataTypeAttrType);
//	//        if (dataTypeAttribute == null)
//	//            continue;
//	//        MappingAttributes.Add(propertyInfo.Name, dataTypeAttribute as NestedConfigAtrribute);
//	//    }
//	//}
//
//	//region  BuildMappingProp
//
//	private void buildMappingGenerator(java.util.ArrayList<FieldGenerator> filedGenerators) {
//
//		for (Map.Entry<String, NestedConfigAtrribute> attributesPair : MappingAttributes.entrySet()) {
//			DataTypeMappingGenerator mppingGen = new DataTypeMappingGenerator(attributesPair.getValue(), attributesPair.getKey());
//			filedGenerators.add(mppingGen);
//			mappingPropNames.put(attributesPair.getKey(), mppingGen.getGeneratedName());
//		}
//	}
//
//	protected java.lang.Class getDataTypeAttrType() {
//		return NestedConfigAtrribute.class;
//	}
//
//	@Override
//	protected CefDataInterfaceInfo getDataTypeInterfaceInfo() {
//		CefDataInterfaceInfo dataTypeInfo;
//		if (IsChildAdaptor) {
//			dataTypeInfo = DacContext.getReposContext().getCefContext().getEntityContext().getChildInterfaceTypes().get(NodeCode);
//		} else {
//			dataTypeInfo = DacContext.getReposContext().getCefContext().getEntityContext().getMainInterfaceType();
//		}
//		return dataTypeInfo;
//	}
//
//	//private List<CefPropertyInfo> buildPropertyInfos()
//	//{
//	//    CefDataInterfaceInfo dataTypeInfo;
//	//    if (IsChildAdaptor)
//	//        dataTypeInfo = DacContext.ReposContext.CefContext.EntityContext.ChildInterfaceTypes[NodeCode];
//	//    else
//	//        dataTypeInfo = DacContext.ReposContext.CefContext.EntityContext.MainInterfaceType;
//	//    var properties = GeneratorUtil.getProps(dataTypeInfo.BaseInterfate).ToList();
//
//	//    foreach (var extendType in dataTypeInfo.ExtendInterfaces)
//	//    {
//	//        properties.AddRange(extendType.getProperties().ToList());
//	//    }
//
//	//    return properties;
//	//}
//
//
//	//endregion
//
//
//	//endregion
//
//
//	//region method
//	@Override
//	protected java.util.ArrayList<ClassMethodGenerator> createMethodGenerators() {
//		//initMappingAttributes();
//
//		java.util.ArrayList<ClassMethodGenerator> methods = super.createMethodGenerators();
//		if (methods == null) {
//			methods = new java.util.ArrayList<ClassMethodGenerator>();
//		}
//		//1 protected abstract List<FilterCondition> getDefaultFilterCondition();
//		DefaultFilterGenerator filterGen = new DefaultFilterGenerator(filterConditions);
//		methods.add(filterGen);
//		//addGetPropertyValueGenerators(methods);
//
//		//2 IEntityData createinstance(ICefReader reader);
//		EntityCreateInsGenerator createInsStatement = getCreateInsGenerator(DacContext, NodeCode, IsChildAdaptor, mappingPropNames, DbColumns);
//		methods.add(createInsStatement);
//		//3 protected abstract void initColumns();
//		DacContext.getReposContext().getCefContext().getRootCompileUnitGenCtx().addImport(GspDbDataType.class.getName());
//		InitColumnsGenerator initColumnGen = new InitColumnsGenerator(DbColumns);
//		methods.add(initColumnGen);
//		//4 object getPropertyChangeValue(string key, object value);
//		ChangeValueGenerator changeValueGen = new ChangeValueGenerator(DacContext, DbColumns, MappingAttributes, associationInfos);
//		methods.add(changeValueGen);
//		//protected abstract List<SortCondition> getDefaultSortCondition();
//		DacContext.getReposContext().getCefContext().getRootCompileUnitGenCtx().addImport(SortCondition.class.getName());
//		DefaultSortMethodGenerator sortGen = new DefaultSortMethodGenerator(sortConditions);
//		methods.add(sortGen);
//
//		//TODO GetValue先家在这里，后续看如何调到基类
//		GetValueGenerator getValueGenerator = new GetValueGenerator(DacContext, DbColumns, MappingAttributes, NodeCode);
//		methods.add(getValueGenerator);
//		methods.add(new GetPropertyColumnMappingMethodGenerator());
//		methods.add(new HasPropColumnMapppingMethodGenerator());
//		methods.add(new SetPropertyColumnMappingMethodGenerator());
//		//protected abstract string innerGetDeleteSql
//		methods.add(new DeleteSqlGenerator(getDeleteSql()));
//		//protected abstract string innerGetInsertSql()
//		methods.add(new InsertSqlPropGenerator(getInsertSql()));
////		methods.add(new InsertFieldsPropGenerator(getInsertColumns()));
//		//protected abstract string innerGetModifySql()
//		methods.add(new ModifySqlGenerator(getModifySql()));
//
//		// protected abstract void initAssociations();
//
//		return methods;
//	}
//
//	//private void addGetPropertyValueGenerator(List<ClassMethodGenerator> gens, CefPropertyInfo item)
//	//{
//	//    var childAttrType = DacContext.ReposContext.CefContext.ChildAttrType;
//	//    var childAttribute = item.getCustomAttribute(childAttrType);
//
//	//    var dataTypeAttrType = DacContext.ReposContext.CefContext.DataTypeAttrType;
//	//    var dataTypeAttribute = item.getCustomAttribute(dataTypeAttrType);
//
//	//    var extendChildAttrType = DacContext.ReposContext.CefContext.ExtendChildAttribute;
//	//    var extendChildAttribute = item.getCustomAttribute(extendChildAttrType);
//
//	//    if (extendChildAttribute != null || childAttribute != null)
//	//        return;
//	//    if (dataTypeAttribute != null)
//	//    {
//	//        gens.Add(new CreateUdtDefMethodGenerator(item, DacContext, NodeCode, associationInfos));
//	//        return;
//	//    }
//	//    var propertyName = item.Name;
//	//    if (!DbColumns.Contains(propertyName))
//	//        return;
//	//    var columnInfo = DbColumns[propertyName];
//	//    if (columnInfo.IsAssociation)
//	//    {
//	//        AddAssgetPropValueGenerator(gens, item, columnInfo);
//	//        return;
//	//    }
//	//    else if (columnInfo.IsEnum)
//	//    {
//	//        AddEnumgetPropValueGenerator(gens, item, columnInfo);
//	//        return;
//	//    }
//	//    else
//	//        AddNormalgetPropValueGenerator(gens, item, columnInfo);
//	//}
//
//	//private void addAssgetPropValueGenerator(List<ClassMethodGenerator> gens, CefPropertyInfo item, DbColumnInfo columnInfo)
//	//{
//	//    AssociationInfo associationInfo = getAssociationInfo(item.Name);
//	//    gens.Add(new EntityCreateAssocationDefMethodGenerator(associationInfo, item.PropertyType, item.Name));
//	//}
//
//	@Override
//	public DataTypeReadPropertyGenerator getReadPropertyGenerator() {
//		return new DataTypeReadPropertyGenerator(DacContext, this.NodeCode, this.IsChildAdaptor, mappingPropNames, DbColumns, associationInfos);
//	}
//
//	private void initConditions() {
//		filterConditions = mainAssembler.getDefaultFilter();
//		sortConditions = mainAssembler.GetDefaultSort();
//		if (filterConditions == null) {
//			filterConditions = new java.util.ArrayList<FilterCondition>();
//		}
//		if (ExtendAssemblers == null || ExtendAssemblers.size() < 1) {
//			return;
//		}
//
//		for (AssemblerInfo extendAssmeblerItem : ExtendAssemblers) {
//
//			ExtendEntityAssembler extendAssembly = (ExtendEntityAssembler) ((extendAssmeblerItem.getAssemblerInstance() instanceof ExtendEntityAssembler) ? extendAssmeblerItem.getAssemblerInstance() : null);
//			filterConditions.addAll(extendAssembly.getDefaultFilter());
//			sortConditions.addAll(extendAssembly.GetDefaultSort());
//		}
//
//	}
//
//	private EntityCreateInsGenerator getCreateInsGenerator(DataTypeDacGenContext dacContext, String nodeCode, boolean isChild, java.util.HashMap<String, String> mappingPropName, DbColumnInfoCollection dbColumns) {
//		return new EntityCreateInsGenerator(dacContext, nodeCode, isChild, mappingPropName, dbColumns);
//	}
//
//	//endregion
//}